home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / nos042_s / ttylink.c < prev    next >
C/C++ Source or Header  |  1994-09-16  |  3KB  |  121 lines

  1. /* Internet TTY "link" (keyboard chat) server
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4.  
  5. /****************************************************************************
  6. *    $Id: ttylink.c 1.2 93/07/16 11:51:53 ROOT_DOS Exp $
  7. *    08 May 93    1.2        GT    Fix warnings.                                    *
  8. *
  9. *  ATARI Version by David Nash - dnash@chaos.demon.co.uk
  10. *
  11. *  __stdargs ttylhandle
  12. *
  13. ****************************************************************************/
  14.  
  15.  
  16. #include <stdio.h>
  17. #include "global.h"
  18. #include "mbuf.h"
  19. #include "socket.h"
  20. #include "telnet.h"
  21. #include "session.h"
  22. #include "proc.h"
  23. #include "tty.h"
  24. #include "mailbox.h"
  25. #include "commands.h"
  26.  
  27. static int Sttylink = -1;    /* Protoype socket for service */
  28.  
  29. int
  30. ttylstart(argc,argv,p)
  31. int argc;
  32. char *argv[];
  33. void *p;
  34. {
  35.     struct sockaddr_in lsocket;
  36.     int s,type;
  37.  
  38.     if(Sttylink != -1){
  39.         return 0;
  40.     }
  41.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  42.     chname(Curproc,"TTYlink listener");
  43.  
  44.     lsocket.sin_family = AF_INET;
  45.     lsocket.sin_addr.s_addr = INADDR_ANY;
  46.     if(argc < 2)
  47.         lsocket.sin_port = IPPORT_TTYLINK;
  48.     else
  49.         lsocket.sin_port = atoi(argv[1]);
  50.  
  51.     Sttylink = socket(AF_INET,SOCK_STREAM,0);
  52.     bind(Sttylink,(char *)&lsocket,sizeof(lsocket));
  53.     listen(Sttylink,1);
  54.     for(;;){
  55.         if((s = accept(Sttylink,NULLCHAR,(int *)NULL)) == -1)
  56.             break;    /* Service is shutting down */
  57.         
  58.         if(availmem() < Memthresh){
  59.             usprintf(s,"System is overloaded; try again later\n");
  60.             shutdown(s,1);
  61.         } else {
  62.             type = TELNET;
  63.             newproc("chat",2048,ttylhandle,s,(void *)&type,NULL,0);
  64.         }
  65.     }
  66.     return 0;
  67. }
  68. /* This function handles all incoming "chat" sessions, be they TCP,
  69.  * NET/ROM or AX.25
  70.  */
  71.  
  72. void __stdargs ttylhandle(s,t,p)
  73. int s;
  74. void *t;
  75. void *p;
  76. {
  77.     int type,index;
  78.     struct session *sp;
  79.     char addr[MAXSOCKSIZE];
  80.     int len = MAXSOCKSIZE;
  81.     struct telnet tn;
  82.  
  83.     type = * (int *)t;
  84.     sockmode(s,SOCK_ASCII);
  85.     sockowner(s,Curproc);    /* We own it now */
  86.     log(s,"open %s",Sestypes[type]);
  87.  
  88.     /* Allocate a session descriptor */
  89.     if((sp = newsession(NULLCHAR,type)) == NULLSESSION){
  90.         usprintf(s,"Too many sessions\n");
  91.         close_s(s);
  92.         return;
  93.     }
  94.     index = (int) (sp - Sessions);
  95.  
  96.     /* Initialize a Telnet protocol descriptor */
  97.     memset((char *)&tn,0,sizeof(tn));
  98.     tn.session = sp;    /* Upward pointer */
  99.     sp->cb.telnet = &tn;    /* Downward pointer */
  100.     sp->s = s;
  101.     sp->proc = Curproc;
  102.  
  103.     getpeername(s,addr,&len);
  104.     tprintf("\007Incoming %s session %u from %s\007\n",
  105.      Sestypes[type],index,psocket(addr));
  106.  
  107.     tnrecv(&tn);
  108. }
  109.  
  110. /* Shut down Ttylink server */
  111. int
  112. ttyl0(argc,argv,p)
  113. int argc;
  114. char *argv[];
  115. void *p;
  116. {
  117.     close_s(Sttylink);
  118.     Sttylink = -1;
  119.     return 0;
  120. }
  121.